#include <stdio.h>
//引入bool类型
#include <stdbool.h>
//此库包含malloc函数
#include <stdlib.h>

//给链表中元素类型起别名，方便修改
#define ElementType int

typedef struct LNode {
    ElementType Data;
    struct LNode * Next;
} LNode, *LinkList;

//初始化链表:构建有一个头结点的单链表
LinkList List_init();
//头插法
LinkList List_HeadInsert(LinkList L, ElementType x);
//尾插法
LinkList List_TailInsert(LinkList L, ElementType x);
//一般插入
LinkList List_Insert(LinkList L);
//按序号查找结点值
LinkList GetElem(LinkList L, ElementType x);
//按值查找表结点
LinkList LocateElem(LinkList L, ElementType x);
//删除结点
bool List_Delete(LinkList L, ElementType x);
//获取表长
int getLength(LinkList L);

int main() {
    LinkList L = List_init();
    L = List_HeadInsert(L, 1);
    L = List_HeadInsert(L, 2);
    L = List_TailInsert(L ,3);
    printf("length = %d\n", getLength(L)-1);
    return 0;
}

LinkList List_init() {
    LinkList L = (LinkList)malloc(sizeof(LNode));
    return L;
}

//头插法
LinkList List_HeadInsert(LinkList L, ElementType x) {
    LinkList xL = (LinkList)malloc(sizeof(LNode));
    xL->Data = x;
    xL->Next = L->Next;
    L->Next = xL;
    return L;
}

//尾插法
LinkList List_TailInsert(LinkList L, ElementType x) {
    //先保存头指针
    LinkList newL = L;
    //遍历各节点，即移动头指针找到尾节点
    while( L->Next != NULL) {
        L = L->Next;
    }
    LinkList xL = (LinkList)malloc(sizeof(LNode));
    xL->Data = x;
    xL->Next = NULL;
    L->Next = xL;
    return newL;
}

int getLength(LinkList Ptrl){
    printf("here\n");
    LinkList p = Ptrl;
    int len = 0;
    while(p != NULL){
        p = p->Next;
        len++;
    }
    return len;
};